package com.dms.modules.product.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dms.modules.product.entity.Product;
import com.dms.modules.merchant.entity.Merchant;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;

import java.util.List;
import java.util.Map;

/**
 * 商品Mapper接口
 */
@Mapper
public interface ProductMapper extends BaseMapper<Product> {
    
    /**
     * 搜索商品
     * @param page 分页参数
     * @param keyword 关键词
     * @param categoryId 分类ID
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param orderBy 排序方式
     * @return 分页结果
     */
    IPage<Product> searchProducts(Page<Product> page,
                                @Param("keyword") String keyword,
                                @Param("categoryId") Long categoryId,
                                @Param("minPrice") Double minPrice,
                                @Param("maxPrice") Double maxPrice,
                                @Param("orderBy") String orderBy);

    /**
     * 根据ID查询商家信息
     * @param merchantId 商家ID
     * @return 商家信息
     */
    Merchant selectMerchantById(@Param("merchantId") Long merchantId);

    /**
     * 获取热门商品
     * @param limit 限制数量
     * @return 商品列表
     */
    List<Product> getHotProducts(@Param("limit") Integer limit);
    
    /**
     * 根据多个类别获取热门商品
     *
     * @param categoryIds 类别ID列表
     * @param limit 限制数量
     * @return 热门商品列表
     */
    List<Product> getHotProductsByCategories(@Param("categoryIds") List<Long> categoryIds, @Param("limit") Integer limit);
    
    /**
     * 获取某个类别下的热门商品及详情
     *
     * @param categoryId 类别ID
     * @param limit 限制数量
     * @return 热门商品详情列表
     */
    List<Map<String, Object>> getHotProductsByCategoryWithDetails(@Param("categoryId") Long categoryId, @Param("limit") Integer limit);
    
    /**
     * 获取与指定商品相似的商品
     *
     * @param productId 商品ID
     * @param limit 限制数量
     * @return 相似商品列表
     */
    List<Map<String, Object>> getSimilarProducts(@Param("productId") Long productId, @Param("limit") Integer limit);

    /**
     * 检查指定分类ID列表下是否存在商品
     *
     * @param categoryIds 分类ID列表
     * @return 如果存在商品返回true，否则返回false
     */
    boolean existsByCategoryIds(@Param("categoryIds") List<Long> categoryIds);
    
    /**
     * 获取新品列表
     * @param limit 限制数量
     * @return 商品列表
     */
    List<Product> getNewProducts(@Param("limit") Integer limit);
    
    /**
     * 获取推荐商品列表
     * @param limit 限制数量
     * @return 商品列表
     */
    List<Product> getRecommendProducts(@Param("limit") Integer limit);
    
    /**
     * 获取商品详情
     *
     * @param productId 商品ID
     * @return 商品详情
     */
    Product getProductDetail(@Param("productId") Long productId);

    /**
     * 获取商家的商品列表
     * @param page 分页参数
     * @param merchantId 商家ID
     * @return 分页结果
     */
    IPage<Product> getProductsByMerchant(Page<Product> page, @Param("merchantId") Long merchantId);

    /**
     * 更新商品状态
     * @param id 商品ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 更新商品库存
     * @param id 商品ID
     * @param stock 库存数量
     * @return 影响行数
     */
    int updateStock(@Param("id") Long id, @Param("stock") Integer stock);

    /**
     * 增加商品销量
     * @param id 商品ID
     * @param quantity 增加数量
     * @return 影响行数
     */
    int increaseSales(@Param("id") Long id, @Param("quantity") Integer quantity);

    /**
     * 增加商品浏览量
     * @param id 商品ID
     * @return 影响行数
     */
    int increaseViewCount(@Param("id") Long id);
} 